package com.lh.utils;

import com.lh.entity.table.RectificationInfo;
import com.lh.entity.table.TreeNode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class RectificationWithDepartmentClassifier {

    // 所有区划列表（目标区划，不变）
    private static final List<String> DEPARTMENTS = Arrays.asList(
            "黄州区", "团风县", "红安县", "麻城市",
            "罗田县", "英山县", "浠水县", "蕲春县",
            "武穴市", "黄梅县", "黄冈高新区","市临空经济区",
            "龙感湖管理区", "白莲河示范区"
    );

    /**
     * 将RectificationInfo列表转换为按区划+三级分类的树状结构
     * 支持不完整层级，即使某些层级为null也能正确统计
     * @param rectificationInfoList 原始数据列表
     * @return 树状结构列表
     */
    public static List<TreeNode> classifyByDepartment(List<RectificationInfo> rectificationInfoList) {
        // 根节点列表，即各区划（初始化时key为纯区划名，如“黄州区”）
        List<TreeNode> rootNodes = new ArrayList<>();
        for (String dept : DEPARTMENTS) {
            rootNodes.add(new TreeNode(dept, dept, 1)); // key=纯区划名，确保后续能匹配
        }

        if (rectificationInfoList == null || rectificationInfoList.isEmpty()) {
            return rootNodes;
        }

        for (RectificationInfo info : rectificationInfoList) {
            // 1. 获取原始departmentName，处理空值
            String rawDeptName = info.getDepartmentName();
            if (rawDeptName == null) {
                continue;
            }
            String standardizedDeptName = rawDeptName.trim(); // 去空格，避免格式问题

            // 2. 核心优化：从rawDeptName中提取匹配的目标区划名（关键修复点）
            String matchedRegion = extractMatchedRegion(standardizedDeptName);
            if (matchedRegion == null) {
                continue; // 未匹配到任何目标区划，跳过
            }

            // 3. 获取各级分类值（不变）
            String level2 = info.getProjectType();       // 原一级→二级
            String level3 = info.getProjectChildType();  // 原二级→三级
            String level4 = info.getProjectChildCategoryType();  // 原三级→四级

            // 4. 用“提取出的纯区划名”查找节点（修复后：用“黄州区”找节点，而非“市资建局黄州区”）
            TreeNode deptNode = findNode(rootNodes, matchedRegion);
            if (deptNode != null) {
                deptNode.incrementCount(); // 统计区划节点总数

                // 处理二级节点（允许为null，不变）
                if (level2 != null) {
                    TreeNode level2Node = findOrCreateNode(deptNode.getChildren(), level2, 2);
                    level2Node.incrementCount();

                    // 处理三级节点（允许为null，不变）
                    if (level3 != null) {
                        TreeNode level3Node = findOrCreateNode(level2Node.getChildren(), level3, 3);
                        level3Node.incrementCount();

                        // 处理四级节点（允许为null，不变）
                        if (level4 != null) {
                            TreeNode level4Node = findOrCreateNode(level3Node.getChildren(), level4, 4);
                            level4Node.incrementCount();
                        }
                    }
                }
            }
        }

        return rootNodes;
    }

    /**
     * 从原始departmentName中提取匹配的目标区划名（核心工具方法）
     * @param standardizedDeptName 标准化后的departmentName（去空格）
     * @return 匹配到的目标区划名（如“黄州区”），未匹配到返回null
     */
    private static String extractMatchedRegion(String standardizedDeptName) {
        // 遍历目标区划列表，找到第一个被包含的区划名
        for (String targetRegion : DEPARTMENTS) {
            if (standardizedDeptName.contains(targetRegion)) {
                return targetRegion; // 返回纯区划名（如从“市资建局黄州区”中返回“黄州区”）
            }
        }
        return null; // 未匹配到任何目标区划
    }

    /**
     * 在节点列表中查找指定key的节点（不变）
     * @param nodes 节点列表
     * @param key 节点key（此处为纯区划名）
     * @return 找到的节点，若不存在则返回null
     */
    private static TreeNode findNode(List<TreeNode> nodes, String key) {
        for (TreeNode node : nodes) {
            if (key != null && key.equals(node.getKey())) {
                return node;
            }
        }
        return null;
    }

    /**
     * 在节点列表中查找指定key的节点，如果不存在则创建新节点（不变）
     * @param nodes 节点列表
     * @param key 节点key
     * @param level 节点级别
     * @return 找到的或新创建的节点
     */
    private static TreeNode findOrCreateNode(List<TreeNode> nodes, String key, int level) {
        for (TreeNode node : nodes) {
            if (key.equals(node.getKey())) {
                return node;
            }
        }
        TreeNode newNode = new TreeNode(key, key, level);
        nodes.add(newNode);
        return newNode;
    }

}
